package com.zw.a.basic.a12.demo08_serializable;

import com.itheima.pojo.Student;

import java.io.*;

//案例: 演示serialVersionUID 和  transient关键字.
/*
    进行序列化和反序列化时候的三个小问题:
        1. 当我们进行序列化操作后, 如果修改了JavaBean, 那么再进行反序列化, 会不会出问题?
            会出问题, 会抛出InvalidClassException异常(未识别的类异常),
            因为序列版本号不一致.

        2. 如果出问题了, 该如何解决?
            方式一: 重新序列化一次.
            方式二: 给对象加一个 序列化版本号属性.

        3. 如果一个对象中的某个属性的值不想被序列化, 该如何实现?
            给该成员变量加一个修饰符: transient.

            transient: 被它修饰的成员变量不参与序列化操作.
 */
public class Demo03 {
    public static void main(String[] args) throws Exception {
        //需求1: 序列化操作.
        //write();

        //需求2: 反序列化操作.
        read();
    }

    public static void read() throws IOException, ClassNotFoundException {
        //1. 创建序列化流, 封装数据源文件.
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("day12/data/1.txt"));
        //2. 进行反序列化操作.
        Student s = (Student)(ois.readObject());
        //3. 打印对象.
        System.out.println(s);
        //4. 关流.
        ois.close();
    }

    public static void write() throws IOException {
        //1. 创建序列化流, 封装目的地文件.
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("day12/data/1.txt"));
        //2. 创建JavaBean对象.
        Student s = new Student("刘亦菲", 33);
        //3. 进行序列化操作.
        oos.writeObject(s);
        //4. 关流.
        oos.close();
    }
}
